package com.axon.components.controls
{
	import com.axon.components.events.AxListEvent;
	
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.ui.Keyboard;
	
	import mx.controls.List;
	import mx.events.ListEvent;

	[Event(name="axChange",		 		type="com.axon.components.events.AxListEvent")]  // name must be equal to AxonListEvent.SELECTION_CHANGE 
	[Event(name="axDefaultGesture", 	type="com.axon.components.events.AxListEvent")]  // name must be equal to AxonListEvent.DEFAULT_GESTURE

	public class AxList extends List
	{
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
   		[Inspectable(category="Other")] public var axHandleDefaultAction : Boolean = true;
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function AxList()
		{
			super();
			addEventListener( ListEvent.CHANGE, 		onChange );
			addEventListener( KeyboardEvent.KEY_DOWN, 	onKeyDown);
			addEventListener( MouseEvent.DOUBLE_CLICK, 	onDoubleClick);
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override public function set dataProvider(value: Object): void
		{
			if (value == dataProvider)
				return;
			
			super.dataProvider = value;
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override public function set selectedItem(value: Object): void
		{
			if (value == selectedItem)
				return;
			
			super.selectedItem = value;
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		override public function set selectedIndex(value: int): void
		{
			if (value == selectedIndex)
				return;
				
			super.selectedIndex = value;
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private function onChange(event: Event): void
		{
			dispatchEvent(new AxListEvent(AxListEvent.SELECTION_CHANGE));
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		protected function onKeyDown(event: KeyboardEvent): void
		{
			if ((event.charCode == Keyboard.SPACE) && selectedItem)
			{
				axPerformDefaultGesture();
			}   
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		protected function onDoubleClick(event: MouseEvent): void
		{
			axPerformDefaultGesture();
		}

		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function axPerformDefaultGesture(): void
		{
			if ( selectedItem )
				dispatchEvent(new AxListEvent(AxListEvent.DEFAULT_GESTURE));
		}

	}
}